dirViking <- file.path(
getwd(), "LCAB_LawMorton1996-NumericalPoolCommunityScaling"
)
dirVikingResults <- file.path(
dirViking, "results-2021-04"
)
resultFormat <- paste0(
"run-",
"%d", # Combination Number, or CombnNum.
"-",
"%s", # Run Seed.
".RDS"
)
# Copied from LawMorton1996-NumericalPoolCommunityScaling-Calculation.R
# TODO: In the future, make this a separate file that everyone can call...
set.seed(38427042)
basal <- c(3, 10, 30, 100, 300, 1000)
consumer <- c(3, 10, 30, 100, 300, 1000) * 2
events <- (max(basal) + max(consumer)) * 2
runs <- 100
logBodySize <- c(-2, -1, -1, 1) # Morton and Law 1997 version.
parameters <- c(0.01, 10, 0.5, 0.2, 100, 0.1)
# Need to rerun seedsPrep to get the random number generation right for seedsRun
seedsPrep <- runif(2 * length(basal) * length(consumer)) * 1E8
seedsRun <- runif(runs * length(basal) * length(consumer)) * 1E8
paramFrame <- with(list(
b = rep(basal, times = length(consumer)),
c = rep(consumer, each = length(basal)),
s1 = seedsPrep[1:(length(basal) * length(consumer))],
s2 = seedsPrep[
(length(basal) * length(consumer) + 1):(
2 * length(basal) * length(consumer))
],
sR = seedsRun
), {
temp <- data.frame(
CombnNum = 0,
Basals = b,
Consumers = c,
SeedPool = s1,
SeedMat = s2,
SeedRuns = "",
SeedRunsNum = 0,
EndStates = I(rep(list(""), length(b))),
EndStatesNum = 0,
EndStateSizes = I(rep(list(""), length(b)))
)
for (i in 1:nrow(temp)) {
seeds <- sR[((i - 1) * runs + 1) : (i * runs)]
temp$SeedRuns[i] <- toString(seeds) # CSV
temp$SeedRunsNum[i] <- length(seeds)
}
temp$CombnNum <- 1:nrow(temp)
temp
})
# Note: n + 2 end states. Failure to finish, failure to obtain state, and state.
for (i in 1:nrow(paramFrame)) {
resultsList <- list(
"No Run" = 0,
"No State" = 0
)
resultsSize <- list(
"0" = 0
)
seeds <- unlist(strsplit(paramFrame$SeedRuns[i], ', '))
for (seed in seeds) {
fileName <- file.path(
dirVikingResults,
sprintf(resultFormat, paramFrame$CombnNum[i], seed)
)
if (file.exists(fileName)) {
temp <- load(fileName)
temp <- eval(parse(text = temp)) # Get objects.
if (is.data.frame(temp)) {
community <- toString(
temp[[ncol(temp)]][[nrow(temp)]]
)
size <- toString(length(temp[[ncol(temp)]][[nrow(temp)]]))
if (community == "") {
resultsList$`No State` <- resultsList$`No State` + 1
resultsSize$`0` <- resultsSize$`0` + 1
} else if (community %in% names(resultsList)) {
resultsList[[community]] <- resultsList[[community]] + 1
resultsSize[[size]] <- resultsSize[[size]] + 1
} else {
resultsList[[community]] <- 1
if (size %in% resultsSize) {
resultsSize[[size]] <- resultsSize[[size]] + 1
} else {
resultsSize[[size]] <- 1
}
}
} else {
resultsList$`No State` <- resultsList$`No State` + 1
resultsSize$`0` <- resultsSize$`0` + 1
}
} else {
resultsList$`No Run` <- resultsList$`No Run` + 1
resultsSize$`0` <- resultsSize$`0` + 1
}
}
paramFrame$EndStates[[i]] <- resultsList
paramFrame$EndStatesNum[i] <- length(resultsList) - 2
paramFrame$EndStateSizes[[i]] <- resultsSize
paramFrame$EndStateSizesNum[i] <- length(resultsSize) - 1
}
# X, Y, Basal and Consumer.
# Z = Sizes of the Endstates.
plotScalingData <- data.frame(
row = rep(paramFrame$CombnNum, paramFrame$EndStatesNum),
Basals = rep(paramFrame$Basals, paramFrame$EndStatesNum),
Consumers = rep(paramFrame$Consumers, paramFrame$EndStatesNum)
)
# Communities
comms <- unlist(lapply(paramFrame$EndStates, names))
freqs <- unlist(paramFrame$EndStates)
freqs <- freqs[comms != "No Run" & comms != "No State"]
comms <- comms[comms != "No Run" & comms != "No State"]
plotScalingData$Communities <- comms
plotScalingData$CommunityFreq <- freqs
# Community Size
temp <- unlist(lapply(strsplit(plotScalingData$Communities, ','), length))
plotScalingData$CommunitySize <- temp
# For usage by the reader.
plotScaling <- plotly::plot_ly(
plotScalingData,
x = ~Basals,
y = ~Consumers,
z = ~CommunitySize
)
plotScaling <- plotly::add_markers(plotScaling)
plotScaling <- plotly::layout(
plotScaling,
scene = list(
xaxis = list(type = "log"),
yaxis = list(type = "log")
)
)
plotScaling
plotScalingData
LS0tDQp0aXRsZTogIlZpa2luZyBSZXN1bHRzLCAyMDIxLTA0Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNCmBgYHtyIGRpcnN9DQpkaXJWaWtpbmcgPC0gZmlsZS5wYXRoKA0KICBnZXR3ZCgpLCAiTENBQl9MYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nIg0KKQ0KZGlyVmlraW5nUmVzdWx0cyA8LSBmaWxlLnBhdGgoDQogIGRpclZpa2luZywgInJlc3VsdHMtMjAyMS0wNCINCikNCnJlc3VsdEZvcm1hdCA8LSBwYXN0ZTAoDQogICJydW4tIiwgDQogICIlZCIsICMgQ29tYmluYXRpb24gTnVtYmVyLCBvciBDb21ibk51bS4NCiAgIi0iLCANCiAgIiVzIiwgIyBSdW4gU2VlZC4NCiAgIi5SRFMiDQopDQpgYGANCg0KYGBge3IgcGFyYW1zfQ0KIyBDb3BpZWQgZnJvbSBMYXdNb3J0b24xOTk2LU51bWVyaWNhbFBvb2xDb21tdW5pdHlTY2FsaW5nLUNhbGN1bGF0aW9uLlINCiMgVE9ETzogSW4gdGhlIGZ1dHVyZSwgbWFrZSB0aGlzIGEgc2VwYXJhdGUgZmlsZSB0aGF0IGV2ZXJ5b25lIGNhbiBjYWxsLi4uDQpzZXQuc2VlZCgzODQyNzA0MikNCg0KYmFzYWwgPC0gYygzLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKQ0KY29uc3VtZXIgPC0gYygzLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSAqIDINCmV2ZW50cyA8LSAobWF4KGJhc2FsKSArIG1heChjb25zdW1lcikpICogMg0KcnVucyA8LSAxMDANCg0KbG9nQm9keVNpemUgPC0gYygtMiwgLTEsIC0xLCAxKSAjIE1vcnRvbiBhbmQgTGF3IDE5OTcgdmVyc2lvbi4NCnBhcmFtZXRlcnMgPC0gYygwLjAxLCAxMCwgMC41LCAwLjIsIDEwMCwgMC4xKQ0KDQojIE5lZWQgdG8gcmVydW4gc2VlZHNQcmVwIHRvIGdldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHJpZ2h0IGZvciBzZWVkc1J1bg0Kc2VlZHNQcmVwIDwtIHJ1bmlmKDIgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkgKiAxRTgNCnNlZWRzUnVuIDwtIHJ1bmlmKHJ1bnMgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkgKiAxRTgNCmBgYA0KDQpgYGB7ciBvcmdhbmlzZVBhcmFtc30NCnBhcmFtRnJhbWUgPC0gd2l0aChsaXN0KA0KICBiID0gcmVwKGJhc2FsLCB0aW1lcyA9IGxlbmd0aChjb25zdW1lcikpLA0KICBjID0gcmVwKGNvbnN1bWVyLCBlYWNoID0gbGVuZ3RoKGJhc2FsKSksDQogIHMxID0gc2VlZHNQcmVwWzE6KGxlbmd0aChiYXNhbCkgKiBsZW5ndGgoY29uc3VtZXIpKV0sDQogIHMyID0gc2VlZHNQcmVwWw0KICAgIChsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSArIDEpOigNCiAgICAgIDIgKiBsZW5ndGgoYmFzYWwpICogbGVuZ3RoKGNvbnN1bWVyKSkNCiAgXSwNCiAgc1IgPSBzZWVkc1J1bg0KKSwgew0KICB0ZW1wIDwtIGRhdGEuZnJhbWUoDQogICAgQ29tYm5OdW0gPSAwLA0KICAgIEJhc2FscyA9IGIsDQogICAgQ29uc3VtZXJzID0gYywNCiAgICBTZWVkUG9vbCA9IHMxLA0KICAgIFNlZWRNYXQgPSBzMiwNCiAgICBTZWVkUnVucyA9ICIiLA0KICAgIFNlZWRSdW5zTnVtID0gMCwNCiAgICBFbmRTdGF0ZXMgPSBJKHJlcChsaXN0KCIiKSwgbGVuZ3RoKGIpKSksDQogICAgRW5kU3RhdGVzTnVtID0gMCwNCiAgICBFbmRTdGF0ZVNpemVzID0gSShyZXAobGlzdCgiIiksIGxlbmd0aChiKSkpDQogICkNCiAgZm9yIChpIGluIDE6bnJvdyh0ZW1wKSkgew0KICAgIHNlZWRzIDwtIHNSWygoaSAtIDEpICogcnVucyArIDEpIDogKGkgKiBydW5zKV0NCiAgICB0ZW1wJFNlZWRSdW5zW2ldIDwtIHRvU3RyaW5nKHNlZWRzKSAjIENTVg0KICAgIHRlbXAkU2VlZFJ1bnNOdW1baV0gPC0gbGVuZ3RoKHNlZWRzKQ0KICB9DQogIHRlbXAkQ29tYm5OdW0gPC0gMTpucm93KHRlbXApDQogIHRlbXANCn0pDQpgYGANCg0KYGBge3IgbG9hZFJlc3VsdHN9DQojIE5vdGU6IG4gKyAyIGVuZCBzdGF0ZXMuIEZhaWx1cmUgdG8gZmluaXNoLCBmYWlsdXJlIHRvIG9idGFpbiBzdGF0ZSwgYW5kIHN0YXRlLg0KZm9yIChpIGluIDE6bnJvdyhwYXJhbUZyYW1lKSkgew0KICByZXN1bHRzTGlzdCA8LSBsaXN0KA0KICAgICJObyBSdW4iID0gMCwNCiAgICAiTm8gU3RhdGUiID0gMA0KICApDQogIHJlc3VsdHNTaXplIDwtIGxpc3QoDQogICAgIjAiID0gMA0KICApDQogIHNlZWRzIDwtIHVubGlzdChzdHJzcGxpdChwYXJhbUZyYW1lJFNlZWRSdW5zW2ldLCAnLCAnKSkNCiAgZm9yIChzZWVkIGluIHNlZWRzKSB7DQogICAgZmlsZU5hbWUgPC0gZmlsZS5wYXRoKA0KICAgICAgZGlyVmlraW5nUmVzdWx0cywNCiAgICAgIHNwcmludGYocmVzdWx0Rm9ybWF0LCBwYXJhbUZyYW1lJENvbWJuTnVtW2ldLCBzZWVkKQ0KICAgICkNCiAgICANCiAgICBpZiAoZmlsZS5leGlzdHMoZmlsZU5hbWUpKSB7DQogICAgICB0ZW1wIDwtIGxvYWQoZmlsZU5hbWUpDQogICAgICB0ZW1wIDwtIGV2YWwocGFyc2UodGV4dCA9IHRlbXApKSAjIEdldCBvYmplY3RzLg0KICAgICAgaWYgKGlzLmRhdGEuZnJhbWUodGVtcCkpIHsNCiAgICAgICAgY29tbXVuaXR5IDwtIHRvU3RyaW5nKA0KICAgICAgICAgIHRlbXBbW25jb2wodGVtcCldXVtbbnJvdyh0ZW1wKV1dDQogICAgICAgICkNCiAgICAgICAgc2l6ZSA8LSB0b1N0cmluZyhsZW5ndGgodGVtcFtbbmNvbCh0ZW1wKV1dW1tucm93KHRlbXApXV0pKQ0KICAgICAgICBpZiAoY29tbXVuaXR5ID09ICIiKSB7DQogICAgICAgICAgcmVzdWx0c0xpc3QkYE5vIFN0YXRlYCA8LSByZXN1bHRzTGlzdCRgTm8gU3RhdGVgICsgMQ0KICAgICAgICAgIHJlc3VsdHNTaXplJGAwYCA8LSByZXN1bHRzU2l6ZSRgMGAgKyAxDQogICAgICAgIH0gZWxzZSBpZiAoY29tbXVuaXR5ICVpbiUgbmFtZXMocmVzdWx0c0xpc3QpKSB7DQogICAgICAgICAgcmVzdWx0c0xpc3RbW2NvbW11bml0eV1dIDwtIHJlc3VsdHNMaXN0W1tjb21tdW5pdHldXSArIDENCiAgICAgICAgICByZXN1bHRzU2l6ZVtbc2l6ZV1dIDwtIHJlc3VsdHNTaXplW1tzaXplXV0gKyAxDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcmVzdWx0c0xpc3RbW2NvbW11bml0eV1dIDwtIDENCiAgICAgICAgICBpZiAoc2l6ZSAlaW4lIHJlc3VsdHNTaXplKSB7DQogICAgICAgICAgICByZXN1bHRzU2l6ZVtbc2l6ZV1dIDwtIHJlc3VsdHNTaXplW1tzaXplXV0gKyAxDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJlc3VsdHNTaXplW1tzaXplXV0gPC0gMQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmVzdWx0c0xpc3QkYE5vIFN0YXRlYCA8LSByZXN1bHRzTGlzdCRgTm8gU3RhdGVgICsgMQ0KICAgICAgICByZXN1bHRzU2l6ZSRgMGAgPC0gcmVzdWx0c1NpemUkYDBgICsgMQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICByZXN1bHRzTGlzdCRgTm8gUnVuYCA8LSByZXN1bHRzTGlzdCRgTm8gUnVuYCArIDENCiAgICAgIHJlc3VsdHNTaXplJGAwYCA8LSByZXN1bHRzU2l6ZSRgMGAgKyAxDQogICAgfQ0KICB9DQogIA0KICBwYXJhbUZyYW1lJEVuZFN0YXRlc1tbaV1dIDwtIHJlc3VsdHNMaXN0DQogIHBhcmFtRnJhbWUkRW5kU3RhdGVzTnVtW2ldIDwtIGxlbmd0aChyZXN1bHRzTGlzdCkgLSAyDQogIHBhcmFtRnJhbWUkRW5kU3RhdGVTaXplc1tbaV1dIDwtIHJlc3VsdHNTaXplDQogIHBhcmFtRnJhbWUkRW5kU3RhdGVTaXplc051bVtpXSA8LSBsZW5ndGgocmVzdWx0c1NpemUpIC0gMQ0KfQ0KYGBgDQoNCjwhLS1gYGB7ciBzaG93UmVzdWx0c30NCnBhcmFtRnJhbWVbLCBjKDE6MywgODoxMCldDQpgYGAtLT4NCg0KYGBge3IgcGxvdDNEfQ0KIyBYLCBZLCBCYXNhbCBhbmQgQ29uc3VtZXIuDQojIFogPSBTaXplcyBvZiB0aGUgRW5kc3RhdGVzLg0KDQoNCnBsb3RTY2FsaW5nRGF0YSA8LSBkYXRhLmZyYW1lKA0KICByb3cgPSByZXAocGFyYW1GcmFtZSRDb21ibk51bSwgcGFyYW1GcmFtZSRFbmRTdGF0ZXNOdW0pLA0KICBCYXNhbHMgPSByZXAocGFyYW1GcmFtZSRCYXNhbHMsIHBhcmFtRnJhbWUkRW5kU3RhdGVzTnVtKSwNCiAgQ29uc3VtZXJzID0gcmVwKHBhcmFtRnJhbWUkQ29uc3VtZXJzLCBwYXJhbUZyYW1lJEVuZFN0YXRlc051bSkNCikNCg0KIyBDb21tdW5pdGllcw0KY29tbXMgPC0gdW5saXN0KGxhcHBseShwYXJhbUZyYW1lJEVuZFN0YXRlcywgbmFtZXMpKQ0KZnJlcXMgPC0gdW5saXN0KHBhcmFtRnJhbWUkRW5kU3RhdGVzKQ0KZnJlcXMgPC0gZnJlcXNbY29tbXMgIT0gIk5vIFJ1biIgJiBjb21tcyAhPSAiTm8gU3RhdGUiXQ0KY29tbXMgPC0gY29tbXNbY29tbXMgIT0gIk5vIFJ1biIgJiBjb21tcyAhPSAiTm8gU3RhdGUiXQ0KDQpwbG90U2NhbGluZ0RhdGEkQ29tbXVuaXRpZXMgPC0gY29tbXMNCnBsb3RTY2FsaW5nRGF0YSRDb21tdW5pdHlGcmVxIDwtIGZyZXFzDQoNCiMgQ29tbXVuaXR5IFNpemUNCnRlbXAgPC0gdW5saXN0KGxhcHBseShzdHJzcGxpdChwbG90U2NhbGluZ0RhdGEkQ29tbXVuaXRpZXMsICcsJyksIGxlbmd0aCkpDQpwbG90U2NhbGluZ0RhdGEkQ29tbXVuaXR5U2l6ZSA8LSB0ZW1wDQoNCiMgRm9yIHVzYWdlIGJ5IHRoZSByZWFkZXIuDQoNCnBsb3RTY2FsaW5nIDwtIHBsb3RseTo6cGxvdF9seSgNCiAgcGxvdFNjYWxpbmdEYXRhLA0KICB4ID0gfkJhc2FscywNCiAgeSA9IH5Db25zdW1lcnMsDQogIHogPSB+Q29tbXVuaXR5U2l6ZQ0KKQ0KDQpwbG90U2NhbGluZyA8LSBwbG90bHk6OmFkZF9tYXJrZXJzKHBsb3RTY2FsaW5nKQ0KDQpwbG90U2NhbGluZyA8LSBwbG90bHk6OmxheW91dCgNCiAgcGxvdFNjYWxpbmcsDQogIHNjZW5lID0gbGlzdCgNCiAgICB4YXhpcyA9IGxpc3QodHlwZSA9ICJsb2ciKSwNCiAgICB5YXhpcyA9IGxpc3QodHlwZSA9ICJsb2ciKQ0KICApDQopDQoNCnBsb3RTY2FsaW5nDQpgYGANCmBgYHtyIHBsb3QzZERhdGF9DQpwbG90U2NhbGluZ0RhdGENCmBgYA0K